package main

import (
	"context"
	"fmt"
	"io"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
	"time"

	"github.com/wailsapp/wails/v2/pkg/runtime"
)

// TODO 修改错误返回格式，现在直接在后台打印没有任何意义

// App struct
type App struct {
	ctx context.Context
}

// NewApp creates a new App application struct
func NewApp() *App {
	return &App{}
}

// startup is called when the app starts. The context is saved
// so we can call the runtime methods
func (a *App) startup(ctx context.Context) {
	a.ctx = ctx
}

// Greet returns a greeting for the given name
func (a *App) Greet(name string) string {
	return fmt.Sprintf("Hello %s, It's show time!", name)
}

func (a *App) SelectFolder() string {
	options := runtime.OpenDialogOptions{
		Title:                "选择文件夹",
		DefaultDirectory:     "C:\\", // Windows 默认路径
		CanCreateDirectories: true,
	}
	folderPath, err := runtime.OpenDirectoryDialog(a.ctx, options)
	if err != nil {
		runtime.LogError(a.ctx, err.Error())
		return ""
	}
	return folderPath
}
func (a *App) OpenFolder(filePath string) error {
	return __ExplorerOpenFolder__(filePath)
}

func __ExplorerOpenFolder__(filePath string) error {
	// 检查路径是否为空
	if strings.TrimSpace(filePath) == "" {
		return fmt.Errorf("路径不能为空")
	}
	// 清理路径并转换为绝对路径
	cleanedPath := filepath.Clean(filePath)
	absPath, err := filepath.Abs(cleanedPath)
	if err != nil {
		return fmt.Errorf("无效的路径: %v", err)
	}

	// 检查目录是否存在
	if _, err := os.Stat(absPath); os.IsNotExist(err) {
		return fmt.Errorf("目录不存在: %s", filePath)
	}
	// 在Windows系统下使用资源管理器打开目录
	if os.PathSeparator == '\\' && os.PathListSeparator == ';' {
		cmd := exec.Command("explorer", absPath)
		err := cmd.Start()
		if err != nil {
			return fmt.Errorf("无法打开目录: %v", err)
		}
		return nil
	} else {
		return fmt.Errorf("不支持的操作系统。或windows资源管理器不在环境变量中")
	}
}
func __GetFolderFile_Array(target string) ([]string, error) {
	dirPath := target
	var imageList []string
	imageExtensions := map[string]bool{ // 支持的图片扩展名
		".jpg":  true,
		".jpeg": true,
		".png":  true,
		".gif":  true,
		".bmp":  true,
		".webp": true,
	}
	// 遍历目录
	err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		// 跳过所有子目录中的内容
		if path != dirPath { // 不是初始目录
			relPath, err := filepath.Rel(dirPath, path)
			if err != nil {
				return err
			}
			if strings.Contains(relPath, string(filepath.Separator)) {
				if info.IsDir() {
					return filepath.SkipDir // 跳过整个子目录
				}
				return nil // 跳过子目录中的文件
			}
		}
		// 处理文件
		if !info.IsDir() {
			ext := strings.ToLower(filepath.Ext(path))
			if imageExtensions[ext] {
				// 将路径转换为斜杠形式，以便前端使用
				path = filepath.ToSlash(path)
				imageList = append(imageList, path)
			}
		}
		return nil
	})

	if err != nil {
		return nil, fmt.Errorf("读取目录失败: %v", err)
	}

	return imageList, nil
}
func (a *App) GetFolderFile_Array(target string) ([]string, error) {
	return __GetFolderFile_Array(target)
}

func (a *App) GetFileB64(target string) []byte {
	blob, err := os.ReadFile(target)
	if err != nil {
		return nil
	}
	return blob
}

func (a *App) CopyFileToPickedFolder(filePath string, action string) error {

	// 获取当前日期格式为 20250705
	current_date := time.Now().Format("20060102")
	picked_folder_name := "picked-" + current_date

	//获取目录绝对路径
	dir := filepath.Dir(filePath)
	picked_folder_absPath := filepath.Join(dir, picked_folder_name)

	// 获取文件名
	filename := filepath.Base(filePath)
	new_filepath := filepath.Join(picked_folder_absPath, filename)

	switch action {
	case "pick":
		// 如果目标文件夹不存在，则创建
		if _, err := os.Stat(picked_folder_absPath); os.IsNotExist(err) {
			if err := os.Mkdir(picked_folder_absPath, 0755); err != nil {
				return fmt.Errorf("创建文件夹失败: %v", err)
			}
		}
		// 打开原文件
		srcFile, err := os.Open(filePath)
		if err != nil {
			return fmt.Errorf("打开原文件失败: %v", err)
		}
		defer srcFile.Close()
		// 创建目标文件
		dstFile, err := os.Create(new_filepath)
		if err != nil {
			return fmt.Errorf("创建目标文件失败: %v", err)
		}
		defer dstFile.Close()

		// 复制文件内容
		_, err = io.Copy(dstFile, srcFile)
		if err != nil {
			return fmt.Errorf("复制文件内容失败: %v", err)
		}
		// 确保所有内容已写入磁盘
		err = dstFile.Sync()
		if err != nil {
			return fmt.Errorf("同步文件失败: %v", err)
		}
	case "unpick":
		// 删除目标文件
		if err := os.Remove(new_filepath); err != nil {
			if !os.IsNotExist(err) { // 如果文件不存在则不报错
				return fmt.Errorf("删除文件失败: %v", err)
			}
		}
	default:
		return fmt.Errorf("未知操作")
	}

	return nil
}

func (a *App) RecycleBinController(filePath string, action string) error {
	if strings.TrimSpace(filePath) == "" {
		return fmt.Errorf("路径不能为空")
	}

	dir := filepath.Dir(filePath)
	currentDate := time.Now().Format("20060102")
	recycleBinFolderName := "recycle-" + currentDate
	recycleBinAbsPath := filepath.Join(dir, recycleBinFolderName)

	switch action {
	case "delete":
		fileName := filepath.Base(filePath)
		targetPath := filepath.Join(recycleBinAbsPath, fileName)

		if err := os.MkdirAll(recycleBinAbsPath, 0755); err != nil {
			return fmt.Errorf("创建文件夹失败: %v", err)
		}

		if err := os.Rename(filePath, targetPath); err != nil {
			return fmt.Errorf("移动文件失败: %v", err)
		}

	case "open":
		if err := __ExplorerOpenFolder__(recycleBinAbsPath); err != nil {
			fmt.Println(recycleBinAbsPath)
			return fmt.Errorf("打开回收站失败: %v", err)
		}
	case "clean":
		if _, err := os.Stat(recycleBinAbsPath); os.IsNotExist(err) {
			return fmt.Errorf("目录不存在: %s", recycleBinAbsPath)
		}
		if err := os.RemoveAll(recycleBinAbsPath); err != nil {
			return fmt.Errorf("清空回收站失败: %v", err)
		}
	case "count":
		if l, err := __GetFolderFile_Array(recycleBinAbsPath); err != nil {
			return fmt.Errorf("0")
		} else {
			return fmt.Errorf("%d", len(l))
		}

	default:
		return fmt.Errorf("未知操作")
	}

	return nil
}
